Traductores e Intérpretes UCAB : Recursion Izquierda
This page last changed on Nov 28, 2006 by juanca.
Uno de los problemas que encontramos al escribir un analizador sintáctico descendente son las producciones cuyos lados derechos comienzan por el mismo símbolo en el lado izquierdo:
ya que un analizador descendente basado en dicha gramática puede tomar la decisión de substituir el lado izquierdo por el lado derecho recursivo infinitamente.
Afortunadamente disponemos de un algoritmo para transformar gramáticas con recursión izquierda en gramáticas equivalentes sin dicha recursión. Eliminación de la Recursión IzquierdaLas producciones de la forma:
donde los βi son los lados derechos que no son recursivos por la izquierda, se transofrman en:
EjemploEn notación ANTLR:
Eliminamos la recursión izquierda así:
También, dado que ANTLR es una notación estilo BNF, podemos intiutivamente escribir:
Ejemplo del Libro del Dragón
que es recursiva izquierda, se transforma en:
Eliminación Total de la Recursión
EjemploLa siguiente gramática exhibe recursión izquierda indirecta:
Esto puede observarse al intentar hacer un Analisis Sintactico Descendente recursivo:
En este caso, S ⇒* Sβ (a partir de S se deriva una Forma Sentencial que comienza por el mismo no-terminal), lo cual indica que hay recursión izquierda (que es posible aplicar una misma serie de sustituciones de lados izquierdos por lados derechos indefinidamente). Los pasos para eliminar la recursión izquierda en la Gramatica dada son los siguientes:
Otra soluciónUna mejor solución se puede lograr dándose cuenta que la gramática con recursión izquierda indirecta es una Gramatica Regular. En particular, es una gramática lineal derecha, la cual tiene una gramática lineal izquierda equivalente que no es recursiva izquierda:
EjemploA veces, podemos eliminar la recursión izquierda usando otros mecanismos. Por ejemplo, cuando eliminamos la ambigüedad de la siguiente gramática, también eliminamos la recursión izquierda.
Usando la notación BNF de ANTLR, la gramática puede escribirse de esta forma:
|
Document generated by Confluence on Oct 04, 2010 11:25 |